﻿//Определение приоритетов лог-сообщений и интерфейса менеджера логгеров и самих логгеров
using System;
using System.Collections.Generic;
using System.Text;
namespace CommonClasses
{
    namespace Logger
    {
        /// <summary>
        /// Приоритеты лог.сообщений
        /// </summary>
        public enum MessagePriority
        {
            /// <summary>
            /// Отладочные сообщения. Могут использоваться для глубокой отладки.
            /// </summary>
            Debug,
            /// <summary>
            ///    Информационные сообщения. Информируют о серьезных событиях в ходе работы
            /// </summary>
            Info,
            /// <summary>
            ///    Предупреждение. Может использоваться в том случае, если обнаружено некое несоответствие ожидаемому поведению.
            /// </summary>
            Warning,
            /// <summary>
            ///    Сообщение об ошибке. Текущая функция не может быть выполнена правильно, хотя общий процесс не прерывается (восстановимая ошибка).
            /// </summary>
            Error,
            /// <summary>
            ///  Сообщение о невосстановимой ошибке. Детектирована некорректная ситуация, которая может привести к фатальной остановке программы.
            /// </summary>
            Critical,
            /// <summary>
            ///    Сообщение о возникшей исключительной ситуации.
            /// </summary>
            Exception
        }

        /// <summary>
        /// Менеджер логгеров
        /// </summary>
        public interface ILoggingManagement : IDisposable
        {
            /// <summary>
            /// Возвращает Logger с указанным именем, если Loggerа с таким именем не существует, то
            /// создает и регистрирует его под указанным именем.
            /// </summary>
            /// <param name="loggerName">Имя автора(компонента) последующих сообщений в лог, отправляемых через возвращённый Logger</param>
            /// <returns>ссылка на зарегистрированного логгера</returns>
            ILogger GetLogger(string loggerName);
            /// <summary>
            /// Сбрасывает лог-сообщения из памяти в указанный при инициализации файл
            /// </summary>
            void FlushToDisk();
        }

        /// <summary>
        /// Дочерний логгер
        /// </summary>
        public interface ILogger
        {
            /// <summary>
            /// Записать лог.сообщение
            /// </summary>
            /// <param name="priority">Приоритет сообщения</param>
            /// <param name="message">Тест сообщения</param>
            void WriteMessage(MessagePriority priority, string message);
            /// <summary>
            /// Записать исключительную ситуацию
            /// </summary>
            /// <param name="e">брошенное или созданное вручную (через new) исключение</param>
            void WriteException(Exception e);
        }
    }
}